#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include "Huffman.h"

#include "gestionfichier.c"
#include "encodage.c"
#include "decodage.c"
#include "fonctions.c"
#include "lectureentete.c"

int main (void)
{

	int choix; /* Choix de l'utilisateur */


	system("cls"); /* Effacement de l'�cran avant de commencer */
	do {
		choix=menu();
	} while(choix!=3); /* Possibilit� de faire plusieurs archives sans relancer le programme */
	return EXIT_SUCCESS;
}

/*----------------------------- MENU ---------------------------------*/
int menu (void)
{
	char choix[10];
	int choixnum;

	/* Affichage du menu */
	printf(
			"\n\n-------------------------------------------------------------------\n"
			"|    COMPRESSION / DECOMPRESSION selon l'Algorithme de Huffman    |\n"
			"\n"
			"-------------------------------------------------------------------\n"
			"| Menu:                                                           |\n\n"
			"| 1 - Compresser un fichier selon la technique de Huffman         |\n"
			"| 2 - Decompresser un fichier .huff                               |\n"
			"| 3 - Quitter le programme                                        |\n"
			"-------------------------------------------------------------------\n");

	printf("\nEntrer votre choix : ");
	scanf("%s",choix); /* Saisie du choix au format texte */
	choixnum = atoi(choix); /*Conversion de la chaine en entier */

	/* Choix de l'utilisateur */
	switch(choixnum){
		case 1 :
			compression(choixnum);
			printf("Compression du fichier finie.\n");
			break;
		case 2 :
			decompression(choixnum);
			printf("Decompression du fichier finie.\n");
			break;
		case 3 :
			printf("\nFin du programmme\n");
			break;
		default :
			printf("\nChoix incorrect. Veuillez ressaisir une option.\n");
			break;
	}
	return choixnum;
}

/*-------------------------- Compression ----------------------*/
void compression(int choix)
{
	/*D�claration des variables */
	char nomfich[100]; /* Nom du fichier � compresser */


	unsigned int carac[MAXCAR]={0}; /* Tableau de 256 �lements pour stocker les occurences */
	struct arbre_huff *arbre;
	struct dictionaire dico[MAXCAR];//={0,0}; /* Correspondance caract�re <-> code */
	// ATTENTION tu n'initialise pas correctement ce tableau de struct dictionaire
	// il faut utiliser un for comme ci dessous
	int i;
	for(i=0; i<MAXCAR; i++) {dico[i].bits=0; dico[i].code=0;}

	unsigned int taille_fich=0; /* Taille du fichier � compresser */
//	unsigned short int nbfich=0; /* Nombre de fichiers dans le repertoire */

	short int mark=0; /* 0 si l'archive existe pas, 1 sinon */


	if(choix==1)
	{
		printf("\nEntrer le chemin du fichier a compresser : \n");
		fflush(stdin); /* Vidage du buffer de l'entr�e standard */

		//gets(nomfich);
		// ATTENTION  humm le jolie buffer overflow ! GCC refuse de compiler cette faille énorme :)
		scanf("%s",nomfich);
		//printf("%s.\n",nomfich); fflush(stdout);

		copier_fichier(nomfich); /* D�placement du fichier dans un r�pertoire temporaire */

		compter_occ(carac,nomfich); /* Analyse du fichier et cr�ation du fichier frequence.txt */
		creer_freq(carac,nomfich); /* Enregistrement dans le fichier frequence.txt */

		arbre=creer_arbre(carac); /* Cr�ation de l'arbre binaire */
		creer_code(arbre,0,0,dico); /* Parcours de l'arbre afin d'atribuer le codage de huffman � chaque caract�re */

		ecrire_codage(dico,nomfich); /* Cr�ation du fichier codage.txt */

		taille_fich=encodage(dico,nomfich); /* Compression fichier */
		ecrire_fichier(carac,nomfich,0,taille_fich,mark); /* Cr�ation de l'archive */

		suppr_arbre(&arbre); /* Lib�ration de l'espace occup� par arbre */
	}
}

/*--------------------------------D�compression---------------------------------*/
void decompression(int choix)
{
	char nom_archive[100]; /* Nom de l'archive */
	unsigned int carac[MAXCAR]={0};
	struct arbre_huff *arbre;
	unsigned int taille_fich=0;
	int taille;
	struct dictionaire dico[MAXCAR];//={0,0}; /* Correspondance caract�re <-> Huffman */
	// ATTENTION tu n'initialise pas correctement ce tableau de struct dictionaire
	// il faut utiliser un for comme ci dessous
	int i;
	for(i=0; i<MAXCAR; i++) {dico[i].bits=0; dico[i].code=0;}

	short int nbfich; /* Nombre de fichiers dans l'archive */

	if(choix==2) /* Si l'archive contient un seul fichier */
	{
		printf("\nEntrer le chemin du fichier a decompresser : ");
		fflush(stdin);
		//gets(nom_archive);
		// ATTENTION  humm le jolie buffer overflow ! GCC refuse de compiler cette faille énorme :)
		scanf("%s",nom_archive);

		/* On r�cup�re les donn�es n�cessaires pour construire l'arbre */
		taille=lire_index(carac,nom_archive,choix,&nbfich,1);
		arbre=creer_arbre(carac); /* Cr�ation de l'arbre de Huffman */
		creer_code(arbre,0,0,dico); /* Association symbole <-> caract�res */

		/* Decodage */
		extraire_nom(nom_archive,arbre,choix,taille,taille_fich,0);
	}


	/* Suppression de l'archive .huff*/
	if(remove(nom_archive)!=0)
	{
		perror("Erreur dans la suppression de l'archive ");
		exit(EXIT_FAILURE);
	}
}



